package org.bibpessoal.daos;

import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.bibpessoal.entidades.Aluguel;
import org.bibpessoal.util.Dao;
import org.bibpessoal.util.IDao;

public class AluguelDAO extends Dao implements IDao {

	@Override
	public boolean salvar(Object obj) {
		if(!(obj instanceof Aluguel)){
			super.imprimeErro("Erro com a instancia: ","Classe diferente de aluguel");
			return false;
		}
		
		try {

			super.iniciarConexao();
			String sql = "insert into emprestimo "
					+ "(dataPedido, nome, endereco, telefone, email, livro_idLivro, livro_idProprietario, usuario_idUsuario)"
					+"values(?,?,?,?,?,?,?,?)";
			
			System.out.println(sql);

			PreparedStatement stmt = (PreparedStatement) super.getCon().prepareStatement(sql);

			java.util.Date data = new java.util.Date();
			stmt.setDate(1,new Date(data.getTime()));
			stmt.setString(2,((Aluguel)obj).getNome());
			stmt.setString(3,((Aluguel)obj).getEndereco());
			stmt.setString(4,((Aluguel)obj).getTelefone());
			stmt.setString(5,((Aluguel)obj).getEmail());
			stmt.setInt(6,((Aluguel)obj).getLivro().getId());
			stmt.setInt(7,((Aluguel)obj).getLivro().getProprietario().getId());
			
			if(((Aluguel)obj).getUsuario().getId() == null)
				stmt.setString(8,null);
			else
				stmt.setInt(8,((Aluguel)obj).getUsuario().getId());
			
			stmt.execute();
			stmt.close();
			return true;

		} catch (SQLException e) {
			super.imprimeErro("Erro ao salvar aluguel", e.getMessage());
			return false;
		}
	}

	@Override
	public boolean alterar(Object obj) {
		return false;
	}

	@Override
	public boolean deletar(Integer codigo) {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public Object carregar(Integer codigo) {
		try {

			super.iniciarConexao();
			ResultSet rs;
			Aluguel aluguel = null;

			String SQL = "select * from emprestimo where idEmprestimo = "+codigo;

			System.out.println(SQL+"//Carrega um livro com todos os dados na memoria."); 

			PreparedStatement ps = super.getCon().prepareStatement(SQL);
			rs = ps.executeQuery();
			while (rs.next()) {  

				aluguel = new Aluguel();
				aluguel.setId(rs.getInt("idEmprestimo"));
				aluguel.getLivro().setId(rs.getInt("livro_idLivro"));
				
			}
			return aluguel;
		} catch (SQLException e) {  
			super.imprimeErro("Erro ao buscar usuario", e.getMessage());
			return null;
		}
	}
	
	public boolean devolverLivro(Integer codigo){
		
		try{
			super.iniciarConexao();

			String sql = "update emprestimo set dataEntrega=? where idEmprestimo = ?";

			System.out.println(sql);

			PreparedStatement stmt = (PreparedStatement) super.getCon().prepareStatement(sql);

			java.util.Date data = new java.util.Date();
			stmt.setDate(1,new Date(data.getTime()));
			stmt.setInt(2,codigo);
			

			stmt.execute();
			stmt.close();
			return true;

		}
		catch (SQLException e) {  
			super.imprimeErro("Erro ao alterar usuario", e.getMessage());
			return false;
		}
	}
	
	public List<Aluguel> listarSolicitacaoEmprestimo(Integer codigoProprietario){
		try {

			super.iniciarConexao();
			ResultSet rs;
			Aluguel aluguel = null;
			List<Aluguel> alugueis = new ArrayList<Aluguel>();

			String SQL = "select a.situacao, b.idEmprestimo, a.idLivro, a.titulo, b.dataPedido, b.dataEntrega, c.nome as solLogado, b.nome as solNaoLogado "
					+ "from livro a inner join emprestimo b ON a.idLivro = b.livro_idLivro left "
					+ "join usuario c ON b.usuario_idUsuario = c.idUsuario "
					+ "where b.livro_idProprietario = "+codigoProprietario+" and b.dataEntrega IS NULL";

			System.out.println(SQL+"//Lista todos livros de um usuario."); 

			PreparedStatement ps = super.getCon().prepareStatement(SQL);
			rs = ps.executeQuery();
			while (rs.next()) {  

				aluguel = new Aluguel();
				aluguel.getLivro().setSituacao(rs.getInt("situacao"));
				aluguel.setId(rs.getInt("idEmprestimo"));
				aluguel.getLivro().setId(rs.getInt("idLivro"));
				aluguel.getLivro().setTitulo(rs.getString("titulo"));
				aluguel.setDataPedido(rs.getDate("dataPedido"));
				aluguel.setNome(rs.getString("solNaoLogado"));
				aluguel.getUsuario().setNome(rs.getString("solLogado"));
				
				alugueis.add(aluguel);
			}
			return alugueis;
		} catch (SQLException e) {  
			super.imprimeErro("Erro ao buscar usuario", e.getMessage());
			return null;
		}
	}

}
